Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [vb.net] Chiamare sub da una classe diversa
Forum - C# / VB.NET - [vb.net] Chiamare sub da una classe diversa

Avatar
growning (Normal User)
Rookie


Messaggi: 22
Iscritto: 17/06/2009

Segnala al moderatore
Postato alle 18:02
Venerdì, 22/01/2010
Ciao, ho creato una classe che deriva un Label che chiamerò mylabel.

In mylabel all'evento "DoubleClick" eseguo del codice.

Come potrei fare a chiamare una sub stante nella classe che istanzia mylabel?

per ora faccio con una select case enorme che vorrei togliere:


Codice sorgente - presumibilmente VB.NET

  1. Protected Overrides Sub OnDoubleClick(ByVal e As System.EventArgs)
  2. 'istruzioni
  3.                   Select Case MyBase.Parent.Name
  4.                     Case form1.Name
  5.                         form1.SUBdachiamare
  6.                 End Select
  7.                        MyBase.OnDoubleClick(e)
  8.         End Sub



Ho provato con i delegate ma non sono riuscito

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:48
Sabato, 23/01/2010
L'idea è questa: dichiara una nuova interfaccia che imponga l'implementazione di quella sub, ad esempio:
Codice sorgente - presumibilmente C# / VB.NET

  1. Interface IMyInterface
  2.    Sub NomeSub()
  3. End Interface


Quindi implementala in ogni form che la label dovrà richiamare:
Codice sorgente - presumibilmente VB.NET

  1. Class Form1
  2.   Implements IMyInterface
  3.  
  4.   Sub SUBForm() Implements IMyInterface.NomeSub
  5.     '...
  6.   End Sub
  7. End Class


Ora dichiara, nella classe myLabel, un dizionario che associa al nome di un form la sua istanza. Il dizionario deve essere tipizzato in modo da contenere elementi di tipo IMyInterface:
Codice sorgente - presumibilmente VB.NET

  1. Class myLabel
  2.   Inherits Label
  3.  
  4.   Private Forms As New Dictionary(Of String, IMyInterface)
  5.   Private form1 As Form1
  6.   '...
  7.  
  8.   Sub New()
  9.     MyBase.New()
  10.     Forms.Add("form1", form1)
  11.     '...
  12.   End Sub
  13.  
  14.   Sub OnDoubleClick()
  15.     '...
  16.     Forms(MyBase.Parent.Name).NomeSub()
  17.   End Sub
  18. End Class


PM Quote
Avatar
growning (Normal User)
Rookie


Messaggi: 22
Iscritto: 17/06/2009

Segnala al moderatore
Postato alle 18:17
Sabato, 23/01/2010
Testo quotato

Postato originariamente da Il Totem:

L'idea è questa: dichiara una nuova interfaccia che imponga l'implementazione di quella sub, ad esempio:
Codice sorgente - presumibilmente C# / VB.NET

  1. Interface IMyInterface
  2.    Sub NomeSub()
  3. End Interface


Quindi implementala in ogni form che la label dovrà richiamare:
Codice sorgente - presumibilmente VB.NET

  1. Class Form1
  2.   Implements IMyInterface
  3.  
  4.   Sub SUBForm() Implements IMyInterface.NomeSub
  5.     '...
  6.   End Sub
  7. End Class


Ora dichiara, nella classe myLabel, un dizionario che associa al nome di un form la sua istanza. Il dizionario deve essere tipizzato in modo da contenere elementi di tipo IMyInterface:
Codice sorgente - presumibilmente VB.NET

  1. Class myLabel
  2.   Inherits Label
  3.  
  4.   Private Forms As New Dictionary(Of String, IMyInterface)
  5.   Private form1 As Form1
  6.   '...
  7.  
  8.   Sub New()
  9.     MyBase.New()
  10.     Forms.Add("form1", form1)
  11.     '...
  12.   End Sub
  13.  
  14.   Sub OnDoubleClick()
  15.     '...
  16.     Forms(MyBase.Parent.Name).NomeSub()
  17.   End Sub
  18. End Class





Ciao, ho provato il tuo codice, ma all'apertura del form ricevo questo errore:

Codice sorgente - presumibilmente Python

  1. Errore durante la creazione del form. Per informazioni dettagliate vedere Exception.InnerException. Errore: Errore durante la creazione del form. Per informazioni dettagliate vedere Exception.InnerException. Errore: Il form ha fatto riferimento a se stesso durante la costruzione da un'istanza predefinita e si è verificata una ricorsione infinita. All'interno del costruttore del form fare riferimento al form utilizzando 'Me.'



Ho provato a sostituire (anche se non c'entra molto)
Codice sorgente - presumibilmente Plain Text

  1. Forms.Add("form1", form1)



con
Codice sorgente - presumibilmente Plain Text

  1. Forms.Add(mybase.parent.name, mybase.parent)



e ricevo quest'errore:

Codice sorgente - presumibilmente C# / VB.NET

  1. Errore durante la creazione del form. Per informazioni dettagliate vedere Exception.InnerException. Errore: Riferimento a un oggetto non impostato su un'istanza di oggetto.



Ultima modifica effettuata da growning il 23/01/2010 alle 21:14
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 12:14
Lunedì, 25/01/2010
Ovviamente non puoi aggiungere form1 alla collezione Forms da form1, poiché per creare un'istanza di form1 viene richiamata la sub New, la quale aggiunge la nuova label, la quale crea a sua volta un'altra istanza di form1, la quale crea una nuova label, e così via all'infinito.

form1 era solo un esempio. Dovrai aggiungere alla collezione Forms i form esistenti, magari tramite My.Forms.

Per quanto riguarda il secondo errore, durante la creazione della label, la proprietà Parent non è ancora impostata, perciò è nulla.

PM Quote
Avatar
growning (Normal User)
Rookie


Messaggi: 22
Iscritto: 17/06/2009

Segnala al moderatore
Postato alle 12:22
Lunedì, 25/01/2010
Testo quotato

Postato originariamente da Il Totem:

Ovviamente non puoi aggiungere form1 alla collezione Forms da form1, poiché per creare un'istanza di form1 viene richiamata la sub New, la quale aggiunge la nuova label, la quale crea a sua volta un'altra istanza di form1, la quale crea una nuova label, e così via all'infinito.

form1 era solo un esempio. Dovrai aggiungere alla collezione Forms i form esistenti, magari tramite My.Forms.

Per quanto riguarda il secondo errore, durante la creazione della label, la proprietà Parent non è ancora impostata, perciò è nulla.



Ok.

ps: prima di questo post non utilizzavo Sub New...è un errore?

Ho provato a spostare tutto il codice che stava sotto l'e OnCreateControl nel Sub New e funziona.

PM Quote